package com.zkh.myutils.utils;

/**
 * 二进制权限树
 * @author zkh
 */
public class AuthTree {
	//当前权限
	private Long auth;
	
	/**
	 * 构造方法
	 * @param binaryAuth 二进制格式的权限
	 */
	public AuthTree(String binaryAuth) {
		this.auth = Long.parseLong(binaryAuth, 2);
	}
	
	/**
	 * 构造方法
	 * @param auth 权限
	 */
	public AuthTree(long auth) {
		this.auth = auth;
	}
	
	/**
	 * 构造方法，默认无权限
	 * @param auth 权限
	 */
	public AuthTree() {
	}

	/**
	 * 添加权限
	 * @param auth 当前权限
	 */
	public void addAuth(long auth) {
		this.auth |= auth;
	}
	
	/**
	 * 移除权限
	 * @param auth 当前权限
	 */
	public void removeAuth(long auth) {
		this.auth &= (~auth);
	}
	
	/**
	 * 获取权限
	 * @return
	 */
	public long getAuth() {
		return auth;
	}
	
	/**
	 * 获取int类型的权限，需要确保所用权限不操作int类型范围
	 * @return
	 */
	public int getIntAuth() {
		return auth.intValue();
	}
	
	/**
	 * 检查权限
	 * @param auth 要检查的权限
	 */
	public boolean hasAuth(long auth) {
		return (this.auth & auth) == auth;
	}
	
	/**
	 * 检查存在其中一个或多个权限
	 * @param auths
	 * @return
	 */
	public boolean existAuth(long... auths) {
		//遍历检查权限
		for(long auth: auths) if(hasAuth(auth)) return true;
		//不存在，返回false
		return false;
	}

	@Override
	public String toString() {
		return Long.toString(auth);
	}
}
